﻿using AutoUpdaterDotNET;
using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AutoUpdaterDemo
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            lblVersion.Text = "版本:" + Application.ProductName + Application.ProductVersion;

            //AutoUpdater.Synchronous = true;

            // string jsonPath = Path.Combine(Environment.CurrentDirectory, "settings.json");
            // 设置 AutoUpdater 使用这个持久化提供者
            // AutoUpdater.PersistenceProvider = new JsonFilePersistenceProvider(jsonPath);

            // 注意不要点忽略这个版本按钮，否则注册表里会存储一个键值，就再弹出更新提示了。你可以手动删除注册表项来恢复更新。
            //@"SOFTWARE\YourAppName" 是指注册表中的一个路径，其中 YourAppName 应替换为你的应用程序的名字。
            //    这将在 HKEY_CURRENT_USER\Software\YourAppName 或
            //    HKEY_LOCAL_MACHINE\Software\YourAppName 下创建相应的项，具体取决于你所选择的权限和访问级别。
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            // 注意服务器打包必须是zip格式，不能是rar格式，直接改后缀为zip也不行。
            // 设置了 AutoUpdater.CheckForUpdateEvent事件后，默认的更新窗口将不会弹出。
            // 文件命名不要有中文。
            AutoUpdater.Start("http://117.148.147.208:8982/update.xml");

            // 若您不想在更新表单上显示“跳过”按钮，那个么只需在上面的代码中添加以下行即可。
            AutoUpdater.ShowSkipButton = false;

            // 如果要同步检查更新，请在启动更新之前将 Synchronous 设置为 true，如下所示。
            AutoUpdater.Synchronous = false;

            // 显示“以后提醒”按钮，那个么只需在上面的代码中添加以下一行即可。
            AutoUpdater.ShowRemindLaterButton = false;

            //如果要忽略先前设置的“以后提醒”和“跳过”设置，则可以将“强制”属性设置为 true。
            //它还将隐藏“跳过”和“稍后提醒”按钮。如果在代码中将强制设置为true，那么XML文件中的强制值将被忽略。
            AutoUpdater.Mandatory = false;

            //您可以通过添加以下代码来打开错误报告。如果执行此自动更新程序。NET 将显示错误消息，如果没有可用的更新或无法从 web 服务器获取 XML 文件。
            AutoUpdater.ReportErrors = true;

            // 如果服务器 xml 文件的版本大于 AssemblyInfo 中的版本则触发 CheckForUpdateEvent
            AutoUpdater.CheckForUpdateEvent += (args) =>
            {
                if (args != null && args.Error == null)
                {
                    // 检测到有可用的更新
                    if (args.IsUpdateAvailable)
                    {
                        DialogResult dialogResult;
                        if (args.Mandatory.Value)
                        {
                            dialogResult =
                                MessageBox.Show(
                                $@"当前有一个新版本{args.CurrentVersion}可用.你正在使用版本{args.InstalledVersion}.点击确认开始更新", @"更新可用",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                        }
                        else
                        {
                            dialogResult =
                                MessageBox.Show(
                                $@"当前有一个新版本{args.CurrentVersion}可用.你正在使用版本{args.InstalledVersion}.确认要更新吗?", @"更新可用",
                                MessageBoxButtons.YesNo,
                                MessageBoxIcon.Information);
                        }

                        if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK))
                        {
                            try
                            {
                                // 触发更新下载
                                if (AutoUpdater.DownloadUpdate(args))
                                {
                                    Application.Exit();
                                }
                            }
                            catch (Exception exception)
                            {
                                MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK,
                                                    MessageBoxIcon.Error);
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show(
                            $@"无可更新的版本,当前版本{args.CurrentVersion}.正在使用版本{args.InstalledVersion}.",
                            @"无可更新的版本", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    if (args.Error is WebException)
                    {
                        MessageBox.Show(
                            @"连接更新服务器失败,请检查网络连接.",
                            @"更新检查失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        MessageBox.Show(args.Error.Message,
                                            args.Error.GetType().ToString(), MessageBoxButtons.OK,
                                            MessageBoxIcon.Error);
                    }
                }
            };
        }
    }
}
